package sv.gob.mh.dgii.model;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

@Entity
@Table(name = "AS_OPCIONES", schema = "SIIT")
public class AsOpcion implements Serializable {

    private static final long serialVersionUID = -1256488896457L;
    @Id
    @SequenceGenerator(name = "SEQ_AS_OPCIONES", sequenceName = "SEQ_AS_OPCIONES", allocationSize = 1, initialValue = 1)
    @Column(name = "C_OPCION", unique = true, nullable = false, insertable = true, precision = 18, scale = 0)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AS_OPCIONES")
    private Long copcion;
    @Column(name = "S_URL", nullable = false, length = 200)
    private String surl;
    @Column(name = "S_OPCION", nullable = false, length = 200)
    private String sopcion;
    @Column(name = "S_MODULO", nullable = false, length = 50)
    private String smodulo;
    @Column(name = "S_APLICACION", nullable = false, length = 50)
    private String saplicacion;
    @Column(name = "B_ACTIVO", nullable = false, length = 1)
    private Boolean bactivo;
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "AS_ROL_OPCION", joinColumns = {
        @JoinColumn(name = "C_OPCION")}, inverseJoinColumns = {
        @JoinColumn(name = "C_ROL")})
    @NotFound(action = NotFoundAction.IGNORE)
    private Set<AsRol> roles = new HashSet<AsRol>(0);
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "C_OPCION_PADRE", nullable = true, updatable = true)
    @NotFound(action = NotFoundAction.IGNORE)
    private AsOpcion opcionPadre;
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "opcionPadre")
    @NotFound(action = NotFoundAction.IGNORE)
    private Set<AsOpcion> opcionesHijas = new HashSet<AsOpcion>(0);

    public Set<AsRol> getRoles() {
        return this.roles;
    }

    public void setRoles(Set<AsRol> roles) {
        this.roles = roles;
    }

    public AsOpcion() {
    }

    public AsOpcion(Long copcion, String surl, String sopcion, String smodulo,
            String saplicacion, Boolean bactivo) {
        this.copcion = copcion;
        this.surl = surl;
        this.sopcion = sopcion;
        this.smodulo = smodulo;
        this.saplicacion = saplicacion;
        this.bactivo = bactivo;
    }

    public String getRolesAsString() {
        StringBuilder sb = new StringBuilder();
        try {
            if (roles != null) {
                for (AsRol r : roles) {
                    if (r.getSrol() != null && !r.getSrol().trim().equals("")) {
                        sb.append(r.getSrol().trim()).append(", ");
                    }
                }
            }
        } catch (Exception e) {
        }
        return sb.substring(0, sb.length() > 0 ? sb.length() - 2 : 0);
    }

    public Long getCopcion() {
        return copcion;
    }

    public void setCopcion(Long copcion) {
        this.copcion = copcion;
    }

    public String getSurl() {
        return surl;
    }

    public void setSurl(String surl) {
        this.surl = surl;
    }

    public String getSopcion() {
        return sopcion;
    }

    public void setSopcion(String sopcion) {
        this.sopcion = sopcion;
    }

    public String getSmodulo() {
        return smodulo;
    }

    public void setSmodulo(String smodulo) {
        this.smodulo = smodulo;
    }

    public String getSaplicacion() {
        return saplicacion;
    }

    public void setSaplicacion(String saplicacion) {
        this.saplicacion = saplicacion;
    }

    public Boolean getBactivo() {
        return bactivo;
    }

    public void setBactivo(Boolean bactivo) {
        this.bactivo = bactivo;
    }

    public AsOpcion getOpcionPadre() {
        return opcionPadre;
    }

    public void setOpcionPadre(AsOpcion opcionPadre) {
        this.opcionPadre = opcionPadre;
    }

    public Set<AsOpcion> getOpcionesHijas() {
        return opcionesHijas;
    }

    public void setOpcionesHijas(Set<AsOpcion> opcionesHijas) {
        this.opcionesHijas = opcionesHijas;
    }
}
